package cn.alex.sso.client.demo.util;

import cn.alex.sso.client.demo.config.LscConfig;
import cn.hutool.core.util.CharsetUtil;
import cn.hutool.core.util.RandomUtil;
import cn.hutool.core.util.StrUtil;
import cn.hutool.core.util.URLUtil;
import cn.hutool.crypto.SecureUtil;

import java.util.TreeMap;

/**
 * 签名工具类
 *
 * @author Alex
 * @date 2025/1/9 下午3:10
 */
public class SignUtil {

    /**
     * 根据参数计算签名
     *
     * @param params 参数
     * @return 签名
     */
    public static TreeMap<String, Object> getSign(TreeMap<String, Object> params) {
        params.put("client", LscConfig.APP_ID);
        params.put("timestamp", String.valueOf(System.currentTimeMillis()));
        params.put("nonce", RandomUtil.randomString(20));

        String s = URLUtil.buildQuery(params, CharsetUtil.CHARSET_UTF_8);
        String sign = SecureUtil.md5(StrUtil.format("{}&key={}", s, LscConfig.APP_SECRET_KEY));

        params.put("sign", sign);

        return params;
    }

    /**
     * 根据参数计算签名
     *
     * @param loginId   账号id
     * @param timestamp 当前时间戳，13位
     * @param nonce     随机字符串
     * @param secretkey 账号id
     * @return 签名
     */
    public static String getSign(Object loginId, String timestamp, String nonce, String secretkey) {
        return SecureUtil.md5("loginId=" + loginId + "&nonce=" + nonce + "&timestamp=" + timestamp + "&key=" + secretkey);
    }

    /**
     * 校验签名
     *
     * @param loginId   账号id
     * @param timestamp 当前时间戳
     * @param nonce     随机字符串
     * @param sign      签名
     * @return 是否通过校验
     */
    public static Boolean checkSign(String loginId, String timestamp, String nonce, String sign) {
        String calcSign = getSign(loginId, timestamp, nonce, LscConfig.APP_SECRET_KEY);
        if (!calcSign.equals(sign)) {
            return false;
        }

        return true;
    }
}
